package net.jgrm.redisadvanced.bloomfilter;

import java.util.Collection;

/**
 * Redis布隆过滤器服务接口
 * 提供布隆过滤器的创建、添加元素、检查元素是否存在等操作
 */
public interface RedisBloomFilterService {

    /**
     * 创建布隆过滤器
     *
     * @param name              布隆过滤器名称
     * @param expectedElements  预期元素数量
     * @param falsePositiveRate 误判率
     */
    void createFilter(String name, long expectedElements, double falsePositiveRate);

    /**
     * 添加元素到布隆过滤器
     *
     * @param name    布隆过滤器名称
     * @param element 要添加的元素
     * @return 是否添加成功（可能返回false，如果元素可能已经存在）
     */
    boolean add(String name, Object element);

    /**
     * 批量添加元素到布隆过滤器
     *
     * @param name     布隆过滤器名称
     * @param elements 要添加的元素集合
     * @return 添加的元素数量
     */
    long addAll(String name, Collection<Object> elements);

    /**
     * 检查元素是否可能存在于布隆过滤器中
     *
     * @param name    布隆过滤器名称
     * @param element 要检查的元素
     * @return 如果返回false，则元素一定不存在；如果返回true，则元素可能存在
     */
    boolean mightContain(String name, Object element);

    /**
     * 批量检查元素是否可能存在于布隆过滤器中
     *
     * @param name     布隆过滤器名称
     * @param elements 要检查的元素集合
     * @return 可能存在的元素集合
     */
    Collection<Object> mightContainAll(String name, Collection<Object> elements);

    /**
     * 删除布隆过滤器
     *
     * @param name 布隆过滤器名称
     * @return 是否删除成功
     */
    boolean deleteFilter(String name);

    /**
     * 检查布隆过滤器是否存在
     *
     * @param name 布隆过滤器名称
     * @return 是否存在
     */
    boolean exists(String name);

    /**
     * 获取布隆过滤器的配置信息
     *
     * @param name 布隆过滤器名称
     * @return 配置信息对象
     */
    BloomFilterConfig getConfig(String name);

    /**
     * 布隆过滤器配置信息类
     */
    class BloomFilterConfig {
        private long expectedElements;
        private double falsePositiveRate;
        private int numHashFunctions;
        private long bitSize;
        private String name;

        // 构造函数
        public BloomFilterConfig(String name, long expectedElements, double falsePositiveRate, int numHashFunctions, long bitSize) {
            this.name = name;
            this.expectedElements = expectedElements;
            this.falsePositiveRate = falsePositiveRate;
            this.numHashFunctions = numHashFunctions;
            this.bitSize = bitSize;
        }

        // Getters and Setters
        public long getExpectedElements() {
            return expectedElements;
        }

        public void setExpectedElements(long expectedElements) {
            this.expectedElements = expectedElements;
        }

        public double getFalsePositiveRate() {
            return falsePositiveRate;
        }

        public void setFalsePositiveRate(double falsePositiveRate) {
            this.falsePositiveRate = falsePositiveRate;
        }

        public int getNumHashFunctions() {
            return numHashFunctions;
        }

        public void setNumHashFunctions(int numHashFunctions) {
            this.numHashFunctions = numHashFunctions;
        }

        public long getBitSize() {
            return bitSize;
        }

        public void setBitSize(long bitSize) {
            this.bitSize = bitSize;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "BloomFilterConfig{" +
                    "name='" + name + '\'' +
                    ", expectedElements=" + expectedElements +
                    ", falsePositiveRate=" + falsePositiveRate +
                    ", numHashFunctions=" + numHashFunctions +
                    ", bitSize=" + bitSize +
                    '}';
        }
    }
}